home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-04-09 | 4.6 KB | 230 lines | [TEXT/EDIT] |
- ; File: combinators.sch. (Eval first.)
- ;
- ; Projection functions.
- ;
- (define identity ; project-1st-of-1
- (lambda (x) x))
- ;
- (define project-1st-of-2
- (lambda (x)
- (lambda (y)
- x)))
- ;
- (define project-2nd-of-2
- (lambda (x)
- identity))
- ;
- (define project-3rd-of-3
- (lambda (x)
- (lambda (y)
- identity)))
- ;
- (define 3-consumer project-3rd-of-3)
- ;
- ; Booleans and conditionals.
- ;
- (define com-true
- project-1st-of-2)
- ;
- (define com-false
- project-2nd-of-2)
- ;
- (define force-a-thunk ; used by com-if and others.
- (lambda (thunk)
- (thunk)))
- ;
- (define com-if
- (lambda (condition)
- (lambda (then)
- (lambda (else)
- (force-a-thunk ((condition then) else))))))
- ;
- (define com-not ; [Michaelson, 1989]
- (lambda (x)
- (((com-if x)
- (lambda () com-false))
- (lambda () com-true))))
- ;
- (define com-and ; [Field, 1989]
- (lambda (x)
- (lambda (y)
- ((x y) com-false))))
- ;
- (define com-or ; [Field, 1989]
- (lambda (x)
- (lambda (y)
- ((x com-true) y))))
- ;
- ; List primitives.
- ;
- (define com-cons
- (lambda (x)
- (lambda (y)
- (lambda (selector)
- ((selector x) y)))))
- ;
- (define com-car
- (lambda (object)
- (object project-1st-of-2)))
- ;
- (define com-cdr
- (lambda (object)
- (object project-2nd-of-2)))
- ;
- (define com-nil ; project-2nd-of-3
- (lambda (x) ; [Field, 1989]
- com-true)) ;
- ;
- (define com-null? ; [Field, 1989]
- (lambda (tuple)
- (tuple (lambda (head)
- (lambda (tail)
- com-false)))))
- ;
- ; Y combinator.
- ;
- (define applicative-order-y
- (lambda (f)
- ((lambda (x) (f (lambda (arg) ((x x) arg))))
- (lambda (x) (f (lambda (arg) ((x x) arg)))))))
- ;
- ; The Mother of All Church numerals.
- ;
- (define com-zero
- project-2nd-of-2)
- ;
- ; Church numeral predicates.
- ;
- (define com-zero?
- (lambda (n)
- (((unravel n) 3-consumer) com-true)))
- ;
- (define com-even? ; [Révész, 1988] (not in book)
- (lambda (n)
- (((unravel n) com-not) com-true)))
- ;
- (define com-odd? ; [Révész, 1988] (not in book)
- (lambda (n)
- (((unravel n) com-not) com-false)))
- ;
- (define com-<? ; [vanMeule]
- (applicative-order-y
- (lambda (less-than?)
- (lambda (x)
- (lambda (y)
- (((com-if (com-zero? x))
- (lambda ()
- (((com-if (com-zero? y))
- (lambda () com-false))
- (lambda () com-true))))
- (lambda ()
- (((com-if (com-zero? y))
- (lambda () com-false))
- (lambda () ((less-than? (com-pred x))
- (com-pred y)))))))))))
- ;
- ; Church numeral operators.
- ;
- (define com-succ
- (lambda (n)
- (lambda (f)
- (lambda (x)
- (f (((unravel n) f) x))))))
- ;
- (define make-ascending-tuple ; part of pred
- (lambda (tuple)
- ((com-cons
- (com-cdr tuple))
- (com-succ (com-cdr tuple)))))
- ;
- (define initial-pred-tuple ; part of pred
- ((com-cons "com-pred called on 0")
- com-zero))
- ;
- (define com-pred
- (lambda (n)
- (com-car
- (((unravel n)
- make-ascending-tuple)
- initial-pred-tuple))))
- ;
- (define com-add ; Révész version [Révész, 1988]
- (lambda (m)
- (lambda (n)
- (lambda (f)
- (lambda (x)
- ((m f)
- ((n f) x)))))))
- ;
- (define com-add ; [vanMeule]
- (lambda (m)
- (lambda (n)
- (lambda (f)
- (lambda (x)
- (((unravel (((unravel n) com-succ) m))
- f) x))))))
- ;
- (define com-sub ; [vanMeule]
- (lambda (m)
- (lambda (n)
- (lambda (f)
- (lambda (x)
- (((unravel (((unravel n) com-pred) m))
- f) x))))))
- ;
- (define com-mul
- (lambda (m)
- (lambda (n)
- (lambda (f)
- ((partial-unravel m)
- ((partial-unravel n) f))))))
- ;
- (define com-quo ; [vanMeule]
- (applicative-order-y
- (lambda (the-quo)
- (lambda (dividend)
- (lambda (divisor)
- (((com-if ((com-<? dividend) divisor))
- (lambda () com-zero))
- (lambda ()
- (com-succ ((the-quo ((com-sub dividend)
- divisor))
- divisor)))))))))
- ;
- (define com-rem) ; Reader defines remainder.
- ;
- (define com-pow ; [Katz, 1988]
- (lambda (m)
- (lambda (n)
- ((partial-unravel n) m))))
- ;
- ; Church numeral utility functions.
- ;
- (define number->church ; make-church-numeral
- (lambda (n)
- (if (zero? n)
- com-zero
- (com-succ
- (number->church (- n 1))))))
- ;
- (define unravel
- (lambda (n)
- (lambda (f)
- (lambda (x)
- ((n f) x)))))
- ;
- (define partial-unravel
- (lambda (n)
- (lambda (f)
- (n f))))
- ;
- (define church->number ; dechurchify-numeral
- (lambda (church-numeral)
- (((unravel church-numeral) 1+) 0)))
- ;
- (define com-one
- (lambda (f)
- (lambda (x)
- (f x))))
- ;
- 'done